package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

const (
	MAXBUFFERSIZE = 4096 //默认缓冲区
	FILENAME      = "C:\\Users\\junma\\Desktop\\goland-workspace\\goland-study\\src\\go_code\\chapter09-file\\test.txt"
	FILENAME2     = "C:\\Users\\junma\\Desktop\\goland-workspace\\goland-study\\src\\go_code\\chapter09-file\\工作计划.txt"
)

var strs []string = make([]string, 10)

//const (
//	O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
//	O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
//	O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
//	O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
//	O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
//	O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用，文件必须不存在
//	O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
//	O_TRUNC  int = syscall.O_TRUNC  // 如果可能，打开时清空文件
//)

func main() {
	//打开文件,模式见const描述
	file, err := os.OpenFile(FILENAME, os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		fmt.Println("读取文件失败n")
		return
	}
	if file != nil {
		defer file.Close()
	}

	//文件，读出文件
	open, err := os.Open(FILENAME2)
	if open != nil {
		defer open.Close()
	}
	BufReaderAndShow(open)
	//文件,写入文件
	BufWriterAndShow(file)
}

//缓冲式写入文件
func BufWriterAndShow(file *os.File) {
	//准备写入文件的语句
	//str := "再次 hello world\n"
	//写入时，使用带缓存的*Writer
	writer := bufio.NewWriter(file)

	for i, v := range strs {
		write, err := writer.Write([]byte(strs[i]))
		if err != nil {
			fmt.Printf("写入失败,index=%d，写入内容=%v\n,返回值=%v", i, v, write)
			return
		}
	}

	//因为writer是带有缓存的，所以使用writer后
	//需要Flush将缓存中的数据写入到文件中
	err := writer.Flush()
	if err != nil {
		fmt.Println("flush失败")
		return
	}
}

//缓冲式读取文件
func BufReaderAndShow(file *os.File) {
	//关闭文件
	if file != nil {
		defer file.Close()
	}

	//读取文件操作
	reader := bufio.NewReader(file)
	i := 0
	for {
		readerStr, err := reader.ReadString('\n') //以什么字符结尾
		if err == io.EOF {                        //io.EOF：表示已经到文件的结尾
			fmt.Println("已经到文件结尾。。。", err)
			break
		}
		if len(readerStr) != 0 {
			strs = append(strs, readerStr)
			i++
		}
	}
	//fmt.Println(strs)
}
